package com.cos.students.services.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.cos.students.bo.SelectCourseBO;
import com.cos.students.common.ResponseResult;
import com.cos.students.dao.RcCourseMapper;
import com.cos.students.dao.RcStudentMapper;
import com.cos.students.entity.RcCourse;
import com.cos.students.entity.RcStudent;
import com.cos.students.entity.RcStudentCourse;
import com.cos.students.dao.RcStudentCourseMapper;
import com.cos.students.services.IRcStudentCourseService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cos.students.vo.output.StudentCourseVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author cos
 * @since 2022-10-24
 */
@Service
public class RcStudentCourseServiceImpl extends ServiceImpl<RcStudentCourseMapper, RcStudentCourse> implements IRcStudentCourseService {
    @Autowired
    private RcCourseMapper courseMapper;
    @Autowired
    private RcStudentMapper studentMapper;
    @Autowired
    private RcStudentCourseMapper scMapper;

    @Override
    public ResponseResult getStudentScore(Integer studentId) {

        return ResponseResult.createSuccess(scMapper.getStudentScore(studentId));
    }

    @Override
    public ResponseResult showCourseTimeTable(Integer studentId) {
        return ResponseResult.createSuccess(scMapper.getCourseTimeTable(studentId));
    }

    @Override
    public ResponseResult delCourse(Integer scId) {
        // 使用 查询课程id
        RcStudentCourse studentCourse = scMapper.selectOne(new QueryWrapper<RcStudentCourse>().eq("sc_id", scId));
        // 使用课程id 获取这个课程数据
        RcCourse rcCourse = courseMapper.selectById(studentCourse.getScCourseId());
        // 修改选修人数
        rcCourse.setCourseSelectedCount(rcCourse.getCourseSelectedCount()-1);
        // 跟新选修人数
        courseMapper.updateById(rcCourse);
        // 删除学员选修数据
        if (scMapper.delete(new QueryWrapper<RcStudentCourse>().eq("sc_id", scId))>0) {
            return ResponseResult.createSuccess("欧克");
        }
        return ResponseResult.createFail("nook");
    }

    @Override
    public ResponseResult getStudentCourse(Integer studentId) {
        List<StudentCourseVo> list = scMapper.getStudentCourse(studentId);
        return ResponseResult.createSuccess(list);
    }

    @Override
    public ResponseResult addStudentCourse(Integer courseId, Integer studentId) {
        //1. 课程是否存在
        //    查询这个课程的年级的值 存在就ok
        RcCourse course = courseMapper.selectOne(
                new QueryWrapper<RcCourse>()
                        .eq("course_id", courseId));
        if (course == null) {
            // 没有这个课程
            return ResponseResult.createFail("该课程不存在");
        }
        //2. 学员id正确
        //    查询 学员和 班级 链表查询 年级的值 有值就代表存在这个学员
        Integer studentGrade = studentMapper.getStudentClassGrade(studentId);
        if (studentGrade == null) {
            // 学员查询不到班级相关数据,该学院不存在
            return ResponseResult.createFail("该学员不存在");
        }
        //3. 学员的年级 和 课程的年级是有一致
        //    利用上面2个查询的结果 判断是否一致就能知道 学员的年级和 课程的年级是否一致\
        if (!studentGrade.equals(course.getCourseGrade())) {
            // 课程年级 和 学员的年级 不一致
            return ResponseResult.createFail("该课程年级不同,无法选修");
        }
        //4. 学员是否已有选择这个课程
        RcStudentCourse rcStudentCourse = scMapper.selectOne(
                new QueryWrapper<RcStudentCourse>()
                        .eq("sc_student_id", studentId)
                        .eq("sc_course_id", courseId));
        if (rcStudentCourse != null) {
            // 学员已有选择这个课程
            return ResponseResult.createFail("该课程以选修,无法重复");
        }
        //5. 课程人数已超最大人数
        RcCourse courseCount = courseMapper.selectOne(
                new QueryWrapper<RcCourse>()
                        .eq("course_id", courseId)
                        .apply(" course_selected_count<course_max_size")
        );
        if (courseCount == null) {
            // 学员已有选择这个课程
            return ResponseResult.createFail("该课程以满,无法选修");
        }
        //6. 上课时间
        // 查询到 学员 现在已有的课程 的时间
        List<String> courseTimeList = scMapper.getStudentCourseTime(studentId);
        // 选修课时间
        String courseTime = course.getCourseTime();
        for (String s : courseTimeList) {
            // 课程是否有时间的重复
            if (SelectCourseBO.check(courseTime, s)) {
                return ResponseResult.createFail("该课程和已有课程时间重复,无法选修");
            }
        }
        //7. 新增
        RcStudentCourse studentCourse = new RcStudentCourse(studentId, courseId);
        if (scMapper.insert(studentCourse) > 0) {
            //8. 修改被选修课 人数加+1
            // 使用已查询好的课程数据对象进行修改
            course.setCourseSelectedCount(course.getCourseSelectedCount() + 1);
            courseMapper.updateById(course);
            return ResponseResult.createSuccess("课程选修成功");
        }

        return ResponseResult.createFail("课程选修失败");
    }
}
